import request from '@/utils/request'

/**
 * 发送聊天消息并接收流式响应
 * @param {string} message - 用户发送的消息
 * @param {string} sessionId - 当前会话ID，用于维持对话上下文
 * @returns {Promise<ReadableStream>} - 返回可读流
 */
export const sendChatMessage = async (message, sessionId) => {
  try {
    // 始终包含sessionId参数，即使它是空值
    const requestData = { 
      message,
      sessionId: sessionId || '' // 确保sessionId为空时传''
    };
    
    // 使用全局request实例的配置来发送流式请求
    // axios不支持直接处理流式响应，所以需要使用fetch
    const token = localStorage.getItem('user_token');
    
    // 创建与request.js一致的请求配置
    const headers = {
      'Content-Type': 'application/json',
      'Accept': 'text/event-stream' // 接受SSE格式的响应
    };
    
    if (token) {
      headers['Authorization'] = `Bearer ${token}`;
    }
    
    // 根据Vite代理配置使用正确的API路径
    // Vite配置中/api被重写到后端服务，所以请求路径应该包含/api前缀
    const response = await fetch('/api/user/chat/stream', {
      method: 'POST',
      headers,
      body: JSON.stringify(requestData)
    });
    
    if (!response.ok) {
      const errorData = await response.json().catch(() => ({}));
      throw new Error(errorData.message || `请求失败: ${response.status}`);
    }
    
    return response.body;
  } catch (error) {
    console.error('发送聊天消息出错:', error);
    throw error;
  }
};

/**
 * 处理流式响应数据
 * @param {ReadableStream} stream - 可读流
 * @param {Function} onChunk - 每接收到一个数据块时的回调函数
 * @param {Function} onError - 发生错误时的回调函数
 * @param {Function} onComplete - 流结束时的回调函数
 */
export const processStreamResponse = async (stream, onChunk, onError, onComplete) => {
  const reader = stream.getReader();
  
  try {
    while (true) {
      const { done, value } = await reader.read();
      if (done) break;
      
      // 将二进制数据转换为文本
      const chunk = new TextDecoder().decode(value);
      
      // 处理可能的多个数据块
      const lines = chunk.split('\n').filter(line => line.trim());
      
      for (const line of lines) {
        try {
          // 处理SSE格式 - 检查并移除"data:"前缀
          let jsonStr = line;
          if (line.startsWith('data:')) {
            jsonStr = line.substring(5); // 移除"data:"前缀
          }
          
          // 解析JSON数据
          const data = JSON.parse(jsonStr);
          onChunk(data);
        } catch (e) {
          console.error('解析JSON出错:', e, line);
          onError(e);
        }
      }
    }
    
    onComplete();
  } catch (error) {
    console.error('处理流式响应出错:', error);
    onError(error);
  }
};

/**
 * 创建旅行计划
 * @param {Object} planData - 旅行计划数据
 * @param {string} planData.title - 旅行主题
 * @param {string} planData.text - 旅行需求
 * @param {string} planData.startTime - 旅行开始时间
 * @param {string} planData.endTime - 旅行结束时间
 * @returns {Promise} - 返回请求结果
 */
export const createTravelPlan = (planData) => {
  return request.post('/api/user/plan/create', planData);
}; 